//
//  DGGNetworkManager.h
//  DGGNetworkingSDK
//
//  Created by Dwt on 2019/12/25.
//

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSUInteger, DGGNetworkRequestType) {
    DGGNetworkRequestGET = 0,       //GET
    DGGNetworkRequestPOST,          //POST
    DGGNetworkRequestPUT,           //PUT
    DGGNetworkRequestDownload       //Download
};

/// 数据请求回调
typedef void (^ResultCallBack)(id result);


@interface DGGNetworkManager : NSObject

/// (必需)单例
+ (instancetype)shareInstance;

/// (必需)定义消息提示的key，默认@"message"，由开发者统一消息提示，本基础框架不接入UI相关
@property (nonatomic, copy) NSString *messageKey;

/// (暂不用)定义接口成功code码，默认@[@"200"]，如果项目接口定义“0”是成功码，则设置@[@"0"]
@property (nonatomic, copy) NSArray <NSString *> *successCodes;

/// (暂不用)登录超时code数组
@property (nonatomic, copy) NSArray <NSString *> *loginTimeoutCodes;

/// 验签规则请求头，调用后处理结果以字典抛回
@property (nonatomic, copy) NSDictionary * (^verifyHeaderCallBack)(DGGNetworkRequestType requestType, NSString *url, NSDictionary *param, NSDictionary *customHeader);

/// GET验签规则，调用后开发者自行处理url字符串拼接，抛回处理后的url；如果不验签，则不调用
@property (nonatomic, copy) NSString * (^signGetUrlCallBack)(NSString *url, NSDictionary *param);

/// 公共参数配置
@property (nonatomic, copy) NSDictionary * (^commonParamCallBack)(void);

/// 针对特殊接口设置Content-Type，默认@"application/x-www-form-urlencoded;charset=utf8"，如果有验签，在验签字典中配置
@property (nonatomic, copy) NSString *content_type;

/// 超时时间
@property (nonatomic, assign) NSTimeInterval timeout;

/// 公共请求头参数配置
@property (nonatomic, copy) NSDictionary * httpHeaders;

/// GET请求
/// @param url 请求地址
/// @param param 参数
/// @param result 数据回调
- (void)get:(NSString *)url
      param:(NSDictionary *)param
     result:(ResultCallBack)result;

/// GET请求-自定义请求header
/// @param url 请求地址
/// @param header 自定义请求头
/// @param param 参数
/// @param result 数据回调
- (void)get:(NSString *)url
     header:(NSDictionary *)header
      param:(NSDictionary *)param
     result:(ResultCallBack)result;

/// POST请求
/// @param url 请求地址
/// @param param 参数
/// @param result 数据回调
- (void)post:(NSString *)url
       param:(NSDictionary *)param
      result:(ResultCallBack)result;

/// POST请求-自定义请求header
/// @param url 请求地址
/// @param header 自定义请求头
/// @param param 参数
/// @param result 数据回调
- (void)post:(NSString *)url
      header:(NSDictionary *)header
       param:(NSDictionary *)param
      result:(ResultCallBack)result;

/// PUT请求
/// @param url 请求地址
/// @param param 参数
/// @param result 数据回调
- (void)put:(NSString *)url
      param:(NSDictionary *)param
     result:(ResultCallBack)result;

/// PUT请求-自定义请求header
/// @param url 请求地址
/// @param header 自定义请求头
/// @param param 参数
/// @param result 数据回调
- (void)put:(NSString *)url
     header:(NSDictionary *)header
      param:(NSDictionary *)param
     result:(ResultCallBack)result;

/// Multi-part请求
/// @param url 请求地址
/// @param param 参数
/// @param filePath 文件路径
/// @param fileName 文件名称
/// @param result 数据回调
- (void)multiPost:(NSString *)url
            param:(NSDictionary *)param
         filePath:(NSURL *)filePath
         fileName:(NSString *)fileName
  requestFileName:(NSString *)requestFileName
           result:(ResultCallBack)result;

/// Multi-part请求-自定义请求header
/// @param url 请求地址
/// @param header 自定义请求头
/// @param param 参数
/// @param filePath 文件路径
/// @param fileName 文件名称
/// @param result 数据回调
- (void)multiPost:(NSString *)url
           header:(NSDictionary *)header
            param:(NSDictionary *)param
         filePath:(NSURL *)filePath
         fileName:(NSString *)fileName
  requestFileName:(NSString *)requestFileName
           result:(ResultCallBack)result;

/// data传输
/// @param url 地址
/// @param param  参数
/// @param fileData  文件内容
/// @param fileName 文件名称
/// @param requestFileName 类型
/// @param result 回调
- (void)multiPost:(NSString *)url
            param:(NSDictionary *)param
         fileData:(NSData *)fileData
         fileName:(NSString *)fileName
  requestFileName:(NSString *)requestFileName
           result:(ResultCallBack)result;

/// data传输-自定义请求header
/// @param url 地址
/// @param header 自定义请求头
/// @param param  参数
/// @param fileData  文件内容
/// @param fileName 文件名称
/// @param requestFileName 类型
/// @param result 回调
- (void)multiPost:(NSString *)url
           header:(NSDictionary *)header
            param:(NSDictionary *)param
         fileData:(NSData *)fileData
         fileName:(NSString *)fileName
  requestFileName:(NSString *)requestFileName
           result:(ResultCallBack)result;


/// POST携请求体
/// @param url 请求地址
/// @param body 请求体
/// @param result 数据回调
- (void)post:(NSString *)url
        body:(NSDictionary *)body
      result:(ResultCallBack)result;

/// POST携请求体-自定义请求header
/// @param url 请求地址
/// @param header 自定义请求头
/// @param body 请求体
/// @param result 数据回调
- (void)post:(NSString *)url
      header:(NSDictionary *)header
        body:(NSDictionary *)body
      result:(ResultCallBack)result;

/// 下载文件-自定义请求header
/// @param url 请求地址
/// @param cachePath 本地缓存地址
/// @param params 请求参数
/// @param headers 请求头
/// @param downloadProgressBlock 下载进度
/// @param result 数据回调
- (void)downLoadFileWithURL:(NSString *)url
                  cachePath:(NSString *)cachePath
                     params:(NSDictionary *)params
                    headers:(NSDictionary *)headers
                   progress:(void (^)(NSProgress *downloadProgress))downloadProgressBlock
                     result:(ResultCallBack)result;


/// 上传文件
/// @param url 请求地址
/// @param param 参数
/// @param block body构造回调
/// @param progress 进度
/// @param result 数据回调
- (NSURLSessionDataTask *)post:(NSString *)url
                         param:(NSDictionary *)param
                         block:(void(^)(id formData))block
                      progress:(void(^)(NSProgress *uploadProgress))progress
                        result:(ResultCallBack)result;

/// 取消当前请求任务
- (void)cancelCurrentRequest;

/// 取消全部请求任务
- (void)cancelAllRequest;

- (void)DELETE:(NSString *)url param:(NSDictionary *)param result:(void(^)(id result))result;
@end
